package control;

import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import pdf.AtendimentoPDF;


import com.itextpdf.text.DocumentException;

import VO.AtendimentoListaVO;
import VO.AtendimentoVO;

import service.AtendimentoService;
import service.ClienteService;
import service.UsuarioService;
import service.StatusService;

import service.ItemService;
import utils.Constantes;
import utils.Utils;

import model.Atendimento;
import model.Cliente;
import model.Usuario;
import model.Habilitacao;
import model.Status;
import model.Item;


public class AtendimentoControl extends GenericControl implements IControl {
	
	private static final long serialVersionUID = 1L;

	public void executar(HttpServletRequest request,
			HttpServletResponse response) {
		this.setRequest(request);
		this.setResponse(response);
		String method = request.getParameter("acao");
		
		if (method.equals("adicionar")) {
			this.adicionar();
		} else if (method.equals("openadicionar")) {
			this.openAdicionar();
		} else if (method.equals("pesquisar")) {
			this.pesquisar();
		} else if (method.equals("openpesquisar")) {
			this.openPesquisar();
		} else if (method.equals("buscarum")) {
			this.buscarum();		
		} else if (method.equals("excluir")) {
			this.excluir();
		} else if (method.equals("openAlterar")) {
			this.openAlterar();
		} else if (method.equals("alterar")) {
			this.alterar();
		} else if (method.equals("pagar")) {
			this.pagar();
		} else if (method.equals("fazer")) {
			this.fazer();
		} else if (method.equals("gerarpdf")) {
			this.gerarpdf();
		}
		Dispatcher.showScreen(this.getRequest(), this.getResponse());

	}

	private void gerarpdf() {
		ArrayList<Atendimento> atendimentos = null;
		Atendimento atendimentoBusca=this.loadActionToModel();
		Usuario usuarioBusca = null;
		if (!Utils.isBlank(this.getRequest().getParameter(Constantes.IDFUNCIONARIO))){
			usuarioBusca = new Usuario();
			usuarioBusca.setId(Integer.valueOf(this.getRequest().getParameter(Constantes.IDFUNCIONARIO)));
			UsuarioService usuarioService = new UsuarioService();
			usuarioBusca = usuarioService.select(usuarioBusca);
		}
		
		
		AtendimentoService servico = new AtendimentoService();
		atendimentos = servico.select(atendimentoBusca,usuarioBusca, 0);
		 String path = "http://" +  this.getRequest().getLocalName() + ":" +
   		 this.getRequest().getLocalPort() +
   		this.getRequest().getContextPath();

		try {
			AtendimentoPDF.gerarPDFAtendimento(atendimentos, path, this.getResponse().getOutputStream());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		this.setRequest(null);
	}

	private void pagar() {
		Atendimento atendimento = loadActionToModel();
		AtendimentoService servico = new AtendimentoService();
		atendimento=servico.select(atendimento);
		
		Status stat = new Status();
		stat.setId(3);
		stat = new StatusService().select(stat);
		
		atendimento.setStatus(stat);
		
//		ItemService itemServico = new ItemService();
//		ArrayList<Item> items = itemServico.select(atendimento);
//		
//		ArrayList<Habilitacao> habilitacaos = new ArrayList<Habilitacao>();
//		
//		if (items ==  null)	items = new ArrayList<Item>();
//		for(Item it : items){
//			if(it.getHabilitacao()!=null)
//			habilitacaos.add(it.getHabilitacao());
//		}
		
		
		atendimento = servico.update(atendimento, null, this.getLogado());
		
		
		AtendimentoVO atendimentoVO = AtendimentoVO.toVO(atendimento);
		
		this.setAtributoRequest(Constantes.MENSAGEM, servico.getResultado());
		this.setAtributoRequest(Constantes.ATENDIMENTO, atendimentoVO);
//		Dispatcher.showScreen(request, response);
		
	}
	
	private void fazer() {
		Atendimento atendimento = loadActionToModel();
		AtendimentoService servico = new AtendimentoService();
		atendimento=servico.select(atendimento);
		
		Status stat = new Status();
		stat.setId(2);
		stat = new StatusService().select(stat);
		
		atendimento.setStatus(stat);
		
//		ItemService itemServico = new ItemService();
//		ArrayList<Item> items = itemServico.select(atendimento);
//		
//		ArrayList<Habilitacao> habilitacaos = new ArrayList<Habilitacao>();
//		
//		if (items ==  null)	items = new ArrayList<Item>();
//		for(Item it : items){
//			if(it.getHabilitacao()!=null)
//			habilitacaos.add(it.getHabilitacao());
//		}
		
		
		atendimento = servico.update(atendimento, null, this.getLogado());
		
		
		AtendimentoVO atendimentoVO = AtendimentoVO.toVO(atendimento);
		
		this.setAtributoRequest(Constantes.MENSAGEM, servico.getResultado());
		this.setAtributoRequest(Constantes.ATENDIMENTO, atendimentoVO);
//		Dispatcher.showScreen(request, response);
		
		
	}

	private void openPesquisar() {
		ArrayList<Atendimento> atendimentos = null;
		
		
		AtendimentoService servico = new AtendimentoService();
		atendimentos=servico.select(new Atendimento(),null, this.getPaginacao().getPaginaAtual());
		this.getPaginacao().setCount(servico.getCount());
		
		loadComboBoxs();
		
		
		ArrayList<AtendimentoListaVO> atendimentosVO = AtendimentoListaVO.toVO(atendimentos);
				
		this.setAtributoRequest(Constantes.ATENDIMENTOS, atendimentosVO);
		this.setAtributoRequest("paginaAtual", this.getPaginacao().getPaginaAtual());
		this.setAtributoRequest("count", this.getPaginacao().getCount());
		
//		Dispatcher.showScreen(request, response);
	}

	private void loadComboBoxs() {
		ArrayList<Status> statuss = null;
		StatusService statusService = new StatusService();
		statuss = statusService.select(new Status(), 0);
		this.setAtributoRequest("statuss", statuss);
	}

	private void openAdicionar() {
		// TODO Auto-generated method stub
//		Dispatcher.showScreen(request, response);
		this.removeAtributoSession(Constantes.ITEMS_SESSION);
	}

	private void alterar() { 
//		pegar as habilitacaos listadas na session e salvar elas junto
		Atendimento atendimento = this.loadActionToModel();
		@SuppressWarnings("unchecked")
		ArrayList<Item> items = (ArrayList<Item>)this.getAtributoSession(Constantes.ITEMS_SESSION);
		
		AtendimentoService servico = new AtendimentoService();
		atendimento = servico.update(atendimento,items, this.getLogado());
		
		
		this.setAtributoRequest(Constantes.ATENDIMENTO,atendimento);
		this.setAtributoRequest(Constantes.MENSAGEM, servico.getResultado());
		this.removeAtributoSession(Constantes.HABILITACAOS_SESSION);

//		Dispatcher.showScreen(request, response);
		
	}

	private void openAlterar() {
		Atendimento atendimentoBusca = this.loadActionToModel();
		
		AtendimentoService servico = new AtendimentoService();
		atendimentoBusca = servico.select(atendimentoBusca);
		
		AtendimentoVO atendimentoVO = AtendimentoVO.toVO(atendimentoBusca);
		
		
		
		
		
		ItemService itemServico = new ItemService();
		ArrayList<Item> items = itemServico.select(atendimentoBusca);
		
		ArrayList<Habilitacao> habilitacaos_session = new ArrayList<Habilitacao>();
		
		if (items ==  null)	items = new ArrayList<Item>();
		for(Item trat : items){
			if(trat.getHabilitacao()!=null)
			habilitacaos_session.add(trat.getHabilitacao());
		}
		
		
		this.setAtributoSession(Constantes.HABILITACAOS_SESSION, habilitacaos_session);
		
		this.setAtributoRequest(Constantes.ATENDIMENTO, atendimentoVO);
//		Dispatcher.showScreen(request, response);
		
	}

	private void excluir() {
		Atendimento atendimentoBusca = this.loadActionToModel();
		
		AtendimentoService servico = new AtendimentoService();
		servico.delete(atendimentoBusca, this.getLogado());
		
		this.setAtributoRequest(Constantes.MENSAGEM, servico.getResultado());
		
		this.openPesquisar();
		
//		Dispatcher.showScreen(request, response);
		
	}

	private void buscarum() {
		Atendimento atendimentoBusca = this.loadActionToModel();
		
		AtendimentoService servico = new AtendimentoService();
		atendimentoBusca = servico.select(atendimentoBusca);
		
		AtendimentoVO atendimentoVO = AtendimentoVO.toVO(atendimentoBusca);
		
		this.setAtributoRequest(Constantes.ATENDIMENTO, atendimentoVO);
//		Dispatcher.showScreen(request, response);
		
	}

	private void pesquisar() {
		ArrayList<Atendimento> atendimentos=null;
		Atendimento atendimentoBusca = this.loadActionToModel();
		
		
		Usuario usuarioBusca = null;
		if (!Utils.isBlank(this.getRequest().getParameter(Constantes.IDFUNCIONARIO))){
			usuarioBusca = new Usuario();
			usuarioBusca.setId(Integer.valueOf(this.getRequest().getParameter(Constantes.IDFUNCIONARIO)));
			UsuarioService usuarioService = new UsuarioService();
			usuarioBusca = usuarioService.select(usuarioBusca);
		}
		
		
//		int paginaAtual=1;
			
//		if (!Utils.isBlank(this.getRequest().getParameter("paginaAtual")))
//			paginaAtual=Integer.valueOf(this.getRequest().getParameter("paginaAtual"));			
//			
//		int count=0;
		
//		Query para filtrar por usuario
//		select * from atendimento where idatendimento in (select idatendimento from item where idhabilitacao in(select idhabilitacao from habilitacao where idusuario = 1))
		
		AtendimentoService servico = new AtendimentoService();
		atendimentos=servico.select(atendimentoBusca,usuarioBusca, this.getPaginacao().getPaginaAtual());
		this.getPaginacao().setCount(servico.getCount());
		
		
		
		
		ArrayList<AtendimentoListaVO> atendimentosVO = AtendimentoListaVO.toVO(atendimentos);
				
		
		loadComboBoxs();

		this.setAtributoRequest(Constantes.ATENDIMENTOS, atendimentosVO);
		this.setAtributoRequest("atendimentoBusca", atendimentoBusca);
		this.setAtributoRequest("usuarioBusca", usuarioBusca);
		
		this.setAtributoRequest("paginaAtual", this.getPaginacao().getPaginaAtual());
		this.setAtributoRequest("count", this.getPaginacao().getCount());
		
		
//		Dispatcher.showScreen(request, response);
		
		
		
		
	}

	private void adicionar() {
		Atendimento atendimento = this.loadActionToModel();
		@SuppressWarnings("unchecked")
		ArrayList<Item> items = (ArrayList<Item>)this.getAtributoSession(Constantes.ITEMS_SESSION);
		
		AtendimentoService servico = new AtendimentoService();
		servico.insert(items, atendimento, this.getLogado());
		this.setAtributoRequest(Constantes.MENSAGEM, servico.getResultado());
//		this.removeAtributoSession(Constantes.HABILITACAOS_SESSION);
		this.removeAtributoSession(Constantes.ITEMS_SESSION);
		
		
//		Dispatcher.showScreen(request, response);
	}

	private Atendimento loadActionToModel() {
		HttpServletRequest request = this.getRequest();
			Atendimento atendimento = new Atendimento();
		
		
		if (!Utils.isBlank(request.getParameter(Constantes.IDATENDIMENTO)))
			atendimento.setId(Integer.valueOf(request.getParameter(Constantes.IDATENDIMENTO)));
		
		if (!Utils.isBlank(request.getParameter(Constantes.DATA)))
			atendimento.setData(request.getParameter(Constantes.DATA));
		
		Cliente cliente = null;
		if (!Utils.isBlank(request.getParameter(Constantes.IDCLIENTE))){
			cliente = new Cliente();
			cliente.setId(Integer.valueOf(request.getParameter(Constantes.IDCLIENTE)));
			ClienteService clienteService = new ClienteService();
			cliente = clienteService.select(cliente);
		}
		atendimento.setCliente(cliente);
		
		if (!Utils.isBlank(request.getParameter(Constantes.HORARIO)))
			atendimento.setHorario(request.getParameter(Constantes.HORARIO));		
		
		Status status = null;
		if  (!Utils.isBlank(request.getParameter(Constantes.IDSTATUS))){
			status = new Status();
			status.setId(Integer.valueOf(request.getParameter(Constantes.IDSTATUS)));
			StatusService statusService = new StatusService();
			status = statusService.select(status);
		}
		atendimento.setStatus(status);
		
		
		
		return atendimento;
	}


}
